﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;

namespace MyBlog.Common
{
    /// <summary>
    /// 发送邮件帮助类
    /// </summary>
    public static class EmailHelper
    {
        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="to">收件人地址，多个用“,”逗号隔开</param>
        /// <param name="title">邮件标题</param>
        /// <param name="content">邮件正文</param>
        public static void SendMail(string to, string title, string content)
        {
            var passwrod = ConfigurationManager.AppSettings["emailPwd"].ToString().Trim();
            var host = ConfigurationManager.AppSettings["emailHost"].ToString().Trim();
            var from = ConfigurationManager.AppSettings["emailFrom"].ToString().Trim();

            SmtpClient client = new SmtpClient(host, 25);
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            //登录邮箱的身份验证
            client.Credentials = new NetworkCredential(from, passwrod);
            MailMessage mm = new MailMessage();
            //邮件的优先级，分为 Low, Normal, High，通常用 Normal即可
            mm.Priority = MailPriority.High;

            //收件方看到的邮件来源；
            //第一个参数是发信人邮件地址
            //第二参数是发信人显示的名称
            //第三个参数是 第二个参数所使用的编码，如果指定不正确，则对方收到后显示乱码
            //936是简体中文的codepage值
            mm.From = new MailAddress(from, "小博客系统", Encoding.GetEncoding(936));
            //邮件的接收者，支持群发，多个地址之间用 半角逗号 分开
            mm.To.Add(to);

            //邮件标题
            mm.Subject = title;

            //这里非常重要，如果你的邮件标题包含中文，这里一定要指定，否则对方收到的极有可能是乱码。
            //936是简体中文的pagecode，如果是英文标题，这句可以忽略不用 
            mm.SubjectEncoding = Encoding.GetEncoding(936);

            //邮件正文是否是HTML格式
            mm.IsBodyHtml = true;

            //邮件正文的编码， 设置不正确， 接收者会收到乱码
            mm.BodyEncoding = Encoding.GetEncoding(936);

            //邮件正文 
            mm.Body = content;

            ////添加附件，第二个参数，表示附件的文件类型，可以不用指定
            //mm.Attachments.Add(new Attachment(@"d:a.doc", System.Net.Mime.MediaTypeNames.Application.Rtf));
            ////可以添加多个附件
            //mm.Attachments.Add( new Attachment( @"d:b.doc") ); 

            Task.Factory.StartNew(() =>
            {
                try
                {
                    client.Send(mm);
                }
                catch (Exception ex)
                {
                    LogHelper.WriteLog("发送邮件到" + to + "失败：" + ex.Message + (ex.InnerException != null ? ex.InnerException.Message : ""));
                }
            });
        }
    }
}
